package com.example.duckshop.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;


public class CircleView extends androidx.appcompat.widget.AppCompatImageView {
    private Paint mPaint;
    private Bitmap mBitmap;

    /**
     * Bitmap类型是Android内置的图像处理类，可用于加载、操作和显示位图图像。
     * Bitmap类提供了许多有用的方法和属性，比如获取宽高、裁剪图像、设置像素等等。
     * Bitmap可以从多个来源获取，包括资源、URI和字节数组等，也可以将Bitmap保存为PNG、JPEG或WEBP等格式。
     */

    public CircleView(@NonNull Context context) {
        super(context,null);
    }

    public CircleView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }


    //通过getDrawable()来获取该ImageView的drawable对象，并将其转换为Bitmap类型。
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        Drawable drawable = getDrawable();
        if(drawable instanceof BitmapDrawable){
            mBitmap = ((BitmapDrawable) drawable).getBitmap();
        }
    }

    private void init(){
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.WHITE);
        mPaint.setStyle(Paint.Style.FILL);

    }

    //重写了onDraw()方法，在视图被绘制时，利用该类内部定义的drawCircle()方法绘制一个圆形的图片，如果图片为空，则调用父类的onDraw()方法。
    @Override
    protected void onDraw(Canvas canvas){

        if (mBitmap != null){
            drawCircle(canvas);
        }else {
            super.onDraw(canvas);
        }

    }


    //在drawCircle()方法中，利用BitmapShader设置画笔的渲染效果，然后通过canvas.drawCircle()方法绘制圆形的图片。然后调用drawBorder()方法来绘制圆形图片的边框。
    private void drawCircle(Canvas canvas) {

        BitmapShader bitmapShader = new BitmapShader(mBitmap,
                Shader.TileMode.CLAMP,
                Shader.TileMode.CLAMP);

        float scaleX = getWidth()/(float)mBitmap.getWidth();
        float scaleY = getHeight()/(float)mBitmap.getHeight();
        Matrix matrix = new Matrix();
        matrix.setScale(scaleX,scaleY);
        bitmapShader.setLocalMatrix(matrix);

        mPaint.setShader(bitmapShader);

        canvas.drawCircle(getWidth()/2f,getHeight()/2f,Math.min(getWidth()/2,getHeight()/2),mPaint);

        drawBorder(canvas);
    }

    //drawBorder()方法中，通过设置画笔的不同属性来绘制圆形图片的边框，最终绘制了一个有边框的圆形图片。
    private void drawBorder(Canvas canvas){
        mPaint.reset();
        mPaint.setAntiAlias(true);

        mPaint.setStyle(Paint.Style.STROKE);

        mPaint.setStrokeWidth(10);

        mPaint.setColor(Color.BLACK);

        canvas.drawCircle(getWidth()/2f,getHeight()/2f,Math.min(getWidth()/2,getHeight()/2)+1,mPaint);
    }
}
